package com.itheima.ydd.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.itheima.ydd.common.ResultData;
import com.itheima.ydd.dto.MenuDto;
import com.itheima.ydd.entity.Menu;
import com.itheima.ydd.entity.Role;
import com.itheima.ydd.entity.User;
import com.itheima.ydd.service.MenuService;
import com.itheima.ydd.service.RoleService;
import com.itheima.ydd.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.awt.*;
import java.time.LocalDateTime;
import java.util.*;
import java.util.List;
import java.util.stream.Collectors;

import static java.awt.SystemColor.menu;

@RestController
@RequestMapping("sys_menu")
@Slf4j
public class MenuController {
    @Autowired
    private MenuService menuService;
    @Autowired
    private UserService userService;
    //根据id查询数据
    @GetMapping("rowInfo")
    public ResultData rowInfo(@RequestParam Long id){
        log.info("根据id查询数据,id:{}",id);
        LambdaQueryWrapper<Menu> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(id!=null,Menu::getId,id);
        Menu menu = menuService.getOne(queryWrapper);
        return ResultData.ok("", menu);
    }

    //修改菜单
    @PostMapping("/update")
    public ResultData update(@RequestBody Menu menu){
        log.info("菜单修改请求参数:{}",menu);
        //修改菜品
        menuService.updateById(menu);
        return ResultData.ok("菜单修改成功","");
    }
    //菜单分页查询
//    @GetMapping("/allData")
//    public ResultData allDate(){
//        log.info("查看菜单所有数据");
//        LambdaQueryWrapper<Menu> queryWrapper = new LambdaQueryWrapper<>();
//        queryWrapper.eq(Menu::getPid,0);
//        List<Menu> listOne = menuService.list(queryWrapper);
//        List<MenuDto> menuDtos = null;
//
//        for (MenuDto menuDto : menuDtos) {
//            LambdaQueryWrapper<Menu> queryWrapper1 = new LambdaQueryWrapper<>();
//            queryWrapper1.eq(Menu::getPid,menuDto.getId());
//            List<Menu> listTwo = menuService.list(queryWrapper1);
//            menuDto.setChildren(listTwo);
//        }
//        return ResultData.ok("",menuDtos);
//    }

    @GetMapping("allData")
    public ResultData addData() {

        LambdaQueryWrapper<Menu> lqw=new LambdaQueryWrapper<>();
        lqw.eq(Menu::getPid,0);
        List<Menu> list = menuService.list(lqw);        //获取到所有的一级菜单

        //遍历把所有的一级菜单设置到Dto中，并条用方法设置特殊属性
        List<MenuDto> menuDtoList=list.stream().map(menu -> {
            //获取所有的子级菜单属性
            MenuDto menuDto=new MenuDto();

            //拷贝普通属性
            BeanUtils.copyProperties(menu,menuDto);

            //设置特殊属性    调用递归方法，设置特殊属性
            setChildren(menuDto);

            //设置号特殊属性，直接返回Dto对象
            return menuDto;
        }).collect(Collectors.toList());
        return ResultData.ok("查询成功", menuDtoList);
    }

    public void setChildren(MenuDto menuDto) {
        //获取所有的子级菜单
        LambdaQueryWrapper<Menu> mlqw=new LambdaQueryWrapper<>();
        mlqw.eq(Menu::getPid,menuDto.getId());
        List<Menu> menuList = menuService.list(mlqw);       //获取所有的子级菜单

        //判断是否存在，不存在则不需要设置，直接结束方法
        if (menuList.isEmpty()){
            return;
        }

        //存在则设置属性，遍历
        List<MenuDto> menuDtoList=menuList.stream().map(item->{
            MenuDto menuDtoSon =new MenuDto();

            //设置普通属性
            BeanUtils.copyProperties(item,menuDtoSon);

            // if (list.size()!=0){
            setChildren(menuDtoSon);
            // }

            //如果为空这直接返回Dto对象
            return menuDtoSon;
        }).collect(Collectors.toList());

        //最重要的东西，每次结束循环时都要把children设置给上级菜单
        menuDto.setChildren(menuDtoList);
    }
    //删除菜品
    @GetMapping("del")
    public ResultData del(@RequestParam Long id){
        log.info("删除菜单id:{}",id);
        LambdaUpdateWrapper<Menu> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(id!=null,Menu::getId,id);
        updateWrapper.set(Menu::getDel_flag,1);
        menuService.update(updateWrapper);
        return ResultData.ok("删除菜品成功","");
    }
    @PostMapping("add")
    public ResultData add(@RequestBody Menu menu){
        log.info("增加菜单:{}",menu);
        menu.setCreate_date(LocalDateTime.now());
        menuService.save(menu);
        return ResultData.ok("增加菜品成功","");
    }
}
